package uno.component;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import uno.Main;

import uno.net.UnoPlay;
import uno.net.UnoPlayer;
import uno.net.UnoServer;

public class UnoMenuBar extends JMenuBar{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -2836365814313191470L;
	private JMenu menu;
	private JMenu playMenu;
	private JMenuItem passItem;
	private JMenuItem connectItem;
	private JMenuItem launchItem;
	private Main parent;
	private UnoPlayer localPeer;
	private final static String CONNECT = "Connect to Server"; 
	private final static String LAUNCH_SERVER = "Launch Server";
	private final static String PASS = "Pass";
	
	
	/**
	 * 
	 * */
	public UnoMenuBar(Main parent){	
		this.parent = parent;
		initialize();
	}
	
	/**
	 * */
	private void initialize() {
		
		// build the first menu.
		this.menu = addFirstMenu("Game");
		//build the second menu
		this.playMenu = addSecondMenu("Play");		
		setEnablePlayCommands(false);
	}
	
	/**
	 * Aggiunge il primo Menu alla menuBar
	 * */
	private JMenu addFirstMenu(String label) {
		JMenu menu = new JMenu(label);
		menu.setMnemonic(KeyEvent.VK_A);
		menu.getAccessibleContext().setAccessibleDescription("Comandi relativi all'organizzazione del gioco");
		JMenuItem item;
		// launch server (become server)
		item = new JMenuItem(LAUNCH_SERVER, KeyEvent.VK_T);
		item.addActionListener(new ActionListener (){
			public void actionPerformed(ActionEvent e) {
				UnoServer.start();
				((JMenuItem)e.getSource()).setEnabled(false);
			}
		});
		setLaunchItem(item);
		menu.add(item);

		// connect to server
		item = new JMenuItem(CONNECT, KeyEvent.VK_T);
		item.addActionListener(new ActionListener (){
			public void actionPerformed(ActionEvent e) {
				localPeer = UnoPlayer.start(getParent());
				setEnableGameCommand(false);
			}
		});
		setConnectItem(item);
        menu.add(item);
    	add(menu);
		return menu;
	}
	

	/**
	 * Aggiunge il secondo Menu alla menuBar
	 * */
	private JMenu addSecondMenu(String label) {
		JMenu menu = new JMenu(label);
		menu.setMnemonic(KeyEvent.VK_P);
		menu.getAccessibleContext().setAccessibleDescription("Comandi relativi alle mosse del gioco");
		
		JMenuItem item;
		item = new JMenuItem(PASS);
		item.addActionListener(new ActionListener () {
			public void actionPerformed(ActionEvent e) {
				// richiamo la funzione per passare il turno
				pass();
			}
		});
		setPassItem(item);
		menu.add(item);
    	add(menu);	
		return menu;
	}
	
	
	/**
	 * funzione di pass:
	 * passa il turno di gioco nel caso non ci sia nessuna carta da giocare
	 */
	private void pass() {
		// non è stata giocata nessuna carta
		// però è necessario:
		// - incrementare il contatore che indica lo stato del gioco
		// - indicare chi ha effettuato la giocata
		// - indicare le carte rimanenti nel mazzo
		UnoPlay play = new UnoPlay(localPeer.getGameStatus().getID() + 1, localPeer.getMyPlayerID(), null, 
				localPeer.getDeck().getDeckSize(), localPeer.getHandOfCard().getHOCSize());
		localPeer.updateStatus(play); 
	}
	
	public void setEnablePlayCommands(boolean flag) {		
		getPassItem().setEnabled(flag);
		playMenu.setEnabled(flag);
	}
	
	public void setEnableGameCommand(boolean flag) {
		connectItem.setEnabled(flag);
		launchItem.setEnabled(flag);
		menu.setEnabled(flag);
	}
	
	public Main getParent() {
		return parent;
	}

	public JMenuItem getPassItem() {
		return passItem;
	}

	public JMenuItem getConnectItem() {
		return connectItem;
	}

	public JMenuItem getLaunchItem() {
		return launchItem;
	}

	public void setPassItem(JMenuItem passItem) {
		this.passItem = passItem;
	}

	public void setConnectItem(JMenuItem connectItem) {
		this.connectItem = connectItem;
	}

	public void setLaunchItem(JMenuItem launchItem) {
		this.launchItem = launchItem;
	}
}

